/**
 函数节流：当持续触发事件时，保证一定时间段内只调用一次事件处理函数。
 若没到规定时间则使用计时器延后，而下一次事件则会重新设定计时器。

 核心思路：在规定时间内只触发一次
 */


/**
 *
 * @param fn
 * @param delay
 * @returns {Function}
 */

// 用定时器实现
// function throttle(fn, delay) {
//     let timer = null
//     return function() {
//         let args = arguments
//         if(!timer){
//             timer = setTimeout(()=>{
//                 fn.apply(this,args)
//                 timer = null
//             },delay)
//         }
//     }
// }



// 用时间戳实现

function throttle(fn, delay) {
    // 利用闭包保存时间
    let last = +new Date()
    return function() {
        let args = arguments
        let now = +new Date()
        if (now - last >= delay) {
            fn.apply(this, args)
            last = +new Date()
        }
    }
}




//用时间戳+定时器实现
/*

function throttle(fn,delay){
    let last=0
    return function(){
        let = args = arguments
        let now = +new Date()
        if( now < last + delay){
            clearTimeout(fn.deferTimer)
            fn.deferTimer = setTimeout(()=>{
                last = now
                fn.apply(this,args)
            },delay)
        }else{
            last = now
           fn.apply(this,args)
        }
    }
}

*/